/**
 * 在定义函数或是类时，如果遇到类型不明确就可以使用泛型
 */
function fn<T, K>(a: T, b: K): T {
    return a
}

// 可以直接调用具有泛型的西数
let aa = fn(10, 5) // 不指定泛型，TS 可以自动对类型进行推断
let bb = fn<boolean, string>(false, 'aa') // 指定泛型

interface Inter {
    length: number
}

// T extends Inter 表示泛型 T 必须是 Inter 的实现类（子类）
function fn2<T extends Inter>(a: T) {
    return a.length
}

fn2({length: 2})

class A<T> {
    name: T

    constructor(name: T) {
        this.name = name
    }
}

const a1 = new A('李四')
const a2 = new A(10)